package editorsvg.editor.atributos;

import editorsvg.editor.tipos.Unidad;
import editorsvg.utilidades.Formato;
import org.apache.batik.parser.DefaultLengthHandler;
import org.apache.batik.parser.LengthHandler;
import org.apache.batik.parser.LengthParser;
import org.w3c.flute.parser.ParseException;

/**
 * Representa un atributo tipo longitud.
 * Contiene un valor double y la undidad en la que se expresa el valor.
 * em	a unit equal to the current font size
 * ex	the x-height, usually the height of a lower case letter x
 * px	pixels (por defecto)
 * pt	points (1 point = 1/72 inch)
 * pc	picas (1 pica = 1/6 inch)
 * cm	centimeters (2.54 cm = inch)
 * mm	millimeters (25.4 cm = inch)
 * in	inche (1 inch = 96 pixels, by default)
 * @author Jorge Berjano
 */
public class AtrLongitud extends Atributo {
    private Double valor;
    private Unidad unidad;
    private Double valorPixeles;
    
    private static final double DPI = 96;

    public AtrLongitud() {
    }    

    public void actualizarTexto() {
        if (valor == null) {
            texto = null;
            return;
        }
        texto = Formato.precision(valor) + (unidad != null && unidad != Unidad.px ? unidad.toString() : "");
    }
    
//    public Unidad getUnidad() {
//        return unidad;
//    }
//
//    public void setUnidad(Unidad unidad) {
//        this.unidad = unidad;
//        actualizarTexto();
//    }

    public Double getValor() {
        return valorPixeles;
    }

    public void setValor(Double valor) {
        this.valor = valor;
        this.valorPixeles = valor;
        this.unidad = Unidad.px;
        actualizarTexto();
    }
    
    @Override
    public void parsear(String texto) throws Exception {   
        valor = null;
        valorPixeles = null;
        if (texto == null) {            
            return;
        }
        
        LengthParser parser = new LengthParser();
        LengthHandler handler = new DefaultLengthHandler() {
            double valor;
            
            @Override
            public void lengthValue(float v) throws ParseException {
                valor = (double) v;
                unidad = Unidad.px;
                valorPixeles = valor;
            }

            @Override
            public void em() throws ParseException {
                unidad = Unidad.em;
            }
            
            @Override
            public void ex() throws ParseException {
                unidad = Unidad.ex;
            }
            
            @Override
            public void px() throws ParseException {
                unidad = Unidad.px;
            }
            
            @Override
            public void pt() throws ParseException {
                valorPixeles = valor * DPI / 72.0;
                unidad = Unidad.pt;
            }
            
            @Override
            public void pc() throws ParseException {
                valorPixeles = valor * DPI / 6.0;
                unidad = Unidad.pc;
            }
            
            @Override
            public void cm() throws ParseException {
                valorPixeles = valor * DPI / 2.54;
                unidad = Unidad.cm;
            }

            @Override
            public void mm() throws ParseException {
                valorPixeles = valor * DPI / 25.4;                
                unidad = Unidad.mm;
            }

            @Override
            public void percentage() throws ParseException {
                unidad = Unidad.percentage;
            }
        };
        parser.setLengthHandler(handler);
        parser.parse(texto);
    }
    
    
}
